METEOROLOGINĖS SĄLYGOS AUTOĮVYKIŲ METU LIETUVOJE¶

Viktorija Mačiulytė, 2024-04-22

TYRIMO PROBLEMATIKA¶

Meteorologija - mokslas apie atmosferos reiškinius, atmosferoje vykstančius procesus ir jų sąveiką su paklotiniu paviršiumi. Visuomenei meteorologija plačiau žinoma jos tyrimų aprėptyje esančiais terminais, kaip „orai“, „klimato kaita“, „potvyniai“, „audros“ ir pan. Neretai tuo pačiu kyla ir klausimai apie tai, kokia grėsmė kyla, koks bus orų poveikis poveikis.</br>
Nustatant meteorologinių sąlygų poveikį iškyla didelių iššūkių, nors sąsajos neretai yra (ar gali būti) numanomos. Tačiau neretai nėra taip lengva sąsajas atrasti dėl kai kurių meteorologinių duomenų trūkumo (ypač pavojingų, tokių kaip kruša, škvalas, ekstremalios liūtys ir pan.) ir ypatingai - dėl poveikio duomenų trūkumo, jų netikslumo ar net neprieinamumo. Taip pat tai riboja ir priežasties (meteorologinių reiškinių) ir pasekmės (poveikio) susiejimo kompleksiškumas ir sudėtingumas. O ir neretai gali būti sudėtinga atskirti duomenų triukšmą, kuris susijęs ne su orų poveikiu, o ne žmogaus veiksmais ar kitais faktoriais.

Dėl to šis tyrimas yra svarbus žingsnis plačiau žengiant meteorologinių sąlygų ir poveikio duomenų tyrimų link. Šis tyrimas padės giliau susipažinti su pradinių duomenų neapibrėžtumo, analizės ir interpretavimo metu kylančiais iššūkiais. O taip pat - atlikti Datacademy pilno duomenų analitikos kurso projektą:)

Tikslas ir hipotezės¶

TIKSLAS - įvertinti meteorologinių sąlygų galimą poveikį registruotiems įskaitiniais autoįvykiams Lietuvoje 2017-2023 metais.

PIRMA HIPOTEZĖ. Daugiausiai autoįvykių įvyko vykstant pavojingoms meteorologinėms sąlygoms.

ANTRA HIPOTEZĖ. Autoįvykių statistikoje nurodomos meteorologinės sąlygos dažniausiai nurodytos tinkamai.

Metodikos santrauka

Pradiniai autoįvykių duomenys paimti iš Transporto kompetencijų agentūros (https://tka.lt/katalogas/eismo-ivykiu-statistika-lietuvoje/#tab-0). Duomenyse pateikiami įskaitiniai autoįvykiai, kuriuose žuvo arba buvo sužeistas bent vienas asmuo 2017-2023 m. Lietuvoje. Šie duomenys apjungti su valandiniais artimiausios meteorologijos stoties duomenimis, gautais iš Lietuvos hidrometeorologijos tarnybos (www.meteo.lt). Pradinių duomenų apdorojimas ir apjungimas atliktas 1_duomenu_apjungimas_importavimas_i_sql.ipynb ir 2_autoivykiu_ir_meteo_duomenu_apjungimas.ipynb užrašinėse. Autoįvykių ir meteorologiniai išmatuoti duomenys toliau analizuojami šioje užrašinėje vertinant: autoįvykių pasikartojimą analizuojamu laikotarpiu, statistikos duomenyse nustatytas meteorologines ir kelio dangos būklės sąlygas ir faktiškai išmatuotas meteorologijos stotyse.

Pagrindinių meteorologinių rodiklių trumpiniai:

  • t - oro temperatūra (2 m. aukštyje), C
  • t_0 - paviršiaus temperatūra (5 cm aukštyje), C
  • rr_per - kritulių kiekis per 1 val., mm
  • ws_max_hw - maksimalus vėjo greitis per 1 val., m/s
  • vis_aws - matomumo nuotolis, m
  • snow_aws - sniego dangos storis, cm
In [1]:
import pandas as pd
import numpy as np
import sqlalchemy
import seaborn as sns
import matplotlib.pyplot as plt
import calendar
import datetime

ANALIZ˶

In [2]:
# Išsaugotą byla nuskaitau dėl kompiuterinių resursų taupymo, nors galima būtų tęsti ir su tuo pačiu kintamuoju, kuris sukurtas antrame skripte. 
autoivykiai_meteo = pd.read_csv(r"C:\Users\...\jupyter_files\projektas\autoivykiai_meteo.csv",  sep=';', encoding = "utf-8-sig", decimal=',',  index_col=0) 
In [3]:
autoivykiai_meteo['autoivykio_laikas']= pd.to_datetime(autoivykiai_meteo['autoivykio_laikas']) 
autoivykiai_meteo['autoivykio_laikas_00min']= pd.to_datetime(autoivykiai_meteo['autoivykio_laikas_00min']) 

# Apjungiamos kelios dangos buklės kategorijos
autoivykiai_meteo["dangos_bukle_konv"] = autoivykiai_meteo["kelio_dangos_bukle"]
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Apledėjęs asfaltas", "Apledėjęs grindinys", "Apledėjęs žvyrkelis", "Apledėjusi kita danga"]), "dangos_bukle_konv"] = "Apledėjusi"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin([ "Apsnigta kita danga", "Apsnigtas asfaltas", "Apsnigtas grindinys", "Apsnigtas žvyrkelis"]), "dangos_bukle_konv" ] = "Apsnigta"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Sausa kita danga", "Sausas asfaltas", "Sausas grindinys", "Sausas žvyrkelis"]),  "dangos_bukle_konv"] = "Sausa"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Šlapia kita danga","Šlapias asfaltas","Šlapias grindinys","Šlapias žvyrkelis"]),  "dangos_bukle_konv"] = "Šlapia"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Užterštas asfaltas","Užterštas grindinys"]),  "dangos_bukle_konv"] = "Užteršta"

1. Pradinių duomenų apžvalga¶

1.1 Bendra statistika¶

Tyrime naudojama 18-os meteorologijos stočių informacija

In [4]:
print(len(autoivykiai_meteo["art_stotis"].unique()), "stočių:" )
print(autoivykiai_meteo["art_stotis"].unique())
18 stočių:
['Laukuvos AMS' 'Varėnos AMS' 'Raseinių AMS' 'Telšių AMS' 'Kauno AMS'
 'Ukmergės AMS' 'Vilniaus AMS' 'Šiaulių AMS' 'Klaipėdos AMS'
 'Dotnuvos AMS' 'Panevėžio AMS' 'Kybartų AMS' 'Lazdijų AMS' 'Šilutės AMS'
 'Utenos AMS' 'Biržų AMS' 'Dūkšto AMS' 'Nidos AMS']
In [5]:
pd.set_option('display.max_columns', None)
autoivykiai_meteo.describe() # exclude=[object, datetime]
Out[5]:
zuvo suzeista autoivykio_laikas plat_wgs ilg_wgs autoivykio_laikas_00min t vis_aws snow_aws t_0 t_min_hw t_max_hw ws_max_hw rr_per rr_per_3val rr_per_6val rr_per_12val snow_aws_per_3val snow_aws_per_6val snow_aws_per_12val ws_max_hw_3val t_0_3val t_min_hw_3val vis_aws_3val
count 20494.000000 20494.000000 20494 20494.000000 20494.000000 20494 20351.000000 20344.000000 20174.000000 20384.000000 20410.000000 20410.000000 20379.000000 20337.000000 20239.000000 20137.000000 19921.000000 20100.000000 19999.000000 19835.000000 20342.000000 20369.000000 20377.000000 20234.000000
mean 0.056260 1.158046 2020-06-24 23:45:06.230116096 55.196691 23.862151 2020-06-24 23:17:05.685566464 11.420854 16744.536129 0.685536 13.790061 10.906247 11.940990 6.847176 0.096691 0.270236 0.474554 0.885352 0.705920 0.729686 0.767633 7.641259 12.257730 10.058875 15559.964070
min 0.000000 0.000000 2017-01-01 03:48:00 53.646849 20.764696 2017-01-01 03:00:00 -22.300000 67.000000 0.000000 -18.800000 -22.500000 -22.200000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -19.400000 -23.200000 67.000000
25% 0.000000 1.000000 2018-09-20 13:03:30 54.711266 23.245594 2018-09-20 13:00:00 3.500000 16178.000000 0.000000 3.400000 3.200000 3.900000 4.600000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 5.300000 2.700000 2.700000 11210.000000
50% 0.000000 1.000000 2020-06-18 16:55:00 54.955506 23.978481 2020-06-18 16:30:00 12.100000 20000.000000 0.000000 13.400000 11.500000 12.600000 6.500000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 7.300000 11.700000 10.500000 19717.000000
75% 0.000000 1.000000 2022-04-15 18:10:15 55.723318 25.204756 2022-04-15 17:45:00 18.800000 20000.000000 0.000000 22.800000 18.100000 19.500000 8.700000 0.000000 0.000000 0.000000 0.400000 0.000000 0.000000 0.000000 9.600000 20.400000 17.000000 20000.000000
max 5.000000 21.000000 2023-12-31 16:57:00 56.437909 26.959662 2023-12-31 16:00:00 34.100000 20000.000000 31.000000 51.300000 33.300000 34.400000 25.300000 18.000000 35.000000 40.700000 45.100000 31.000000 32.000000 32.000000 26.100000 48.000000 33.100000 20000.000000
std 0.257814 0.663037 NaN 0.548870 1.362334 NaN 9.288258 5740.237654 2.791513 11.590931 9.133323 9.443453 3.097132 0.543221 1.160637 1.702546 2.628084 2.834513 2.890254 2.973853 3.193751 10.966844 8.891871 6419.396872
In [6]:
ivykio_rusis = autoivykiai_meteo["ivykio_rusis"].count()
ivykio_laikas = pd.to_datetime(autoivykiai_meteo["autoivykio_laikas"].dt.strftime('%H:%M:%S'), format='%H:%M:%S').mean().strftime('%H:%M:%S')
t = round(autoivykiai_meteo["t"].mean(), 1)
t_0 =  round(autoivykiai_meteo["t_0"].mean(), 1)
vis_aws =  round(autoivykiai_meteo["vis_aws"].mean(), 1)
snow_aws =  round(autoivykiai_meteo["snow_aws"].mean(), 1)
ws_max_hw =  round(autoivykiai_meteo["ws_max_hw"].mean(), 1)
rr_per =  round(autoivykiai_meteo["rr_per"].mean(), 1)
In [7]:
print(f" Iš viso 2017-2023 m. laikotarpiu užfiksuoti {ivykio_rusis} įskaitiniai (kai žuvo ar buvo sužeistas bent vienas asmuo) autoįvykiai Lietuvoje.\n Vidutinis laikas, kai įvyko eismo įvykis: {ivykio_laikas} \n Vidutinės meteorologinės sąlygos autoįvykio metu yra: \n vidutinė oro temperatūra (t) {t} C \n vidutinė paviršiaus oro temperatūra (t_0) {t_0} C \n vidutinis matomumas (vis_aws) {vis_aws} m \n vidutinis sniego dangos storis (snow_aws) {snow_aws} cm \n vidutinis maksimalus vėjo greitis (ws_max_hm) {ws_max_hw} m/s \n ir vidutinis valandos kritulių kiekis (rr_per) {rr_per} mm ")
 Iš viso 2017-2023 m. laikotarpiu užfiksuoti 20494 įskaitiniai (kai žuvo ar buvo sužeistas bent vienas asmuo) autoįvykiai Lietuvoje.
 Vidutinis laikas, kai įvyko eismo įvykis: 14:31:58 
 Vidutinės meteorologinės sąlygos autoįvykio metu yra: 
 vidutinė oro temperatūra (t) 11.4 C 
 vidutinė paviršiaus oro temperatūra (t_0) 13.8 C 
 vidutinis matomumas (vis_aws) 16744.5 m 
 vidutinis sniego dangos storis (snow_aws) 0.7 cm 
 vidutinis maksimalus vėjo greitis (ws_max_hm) 6.8 m/s 
 ir vidutinis valandos kritulių kiekis (rr_per) 0.1 mm 

Duomenyse yra 6 object tipo kintamieji (autoįvykius apibūdinantys duomenys), du laiko (autoįvykio datos ir valandos 00 min. kurią naudont buvo jungiami autoįvykių duomenys su meteorologiniais duomenimis. Likę - float tipo.

In [8]:
autoivykiai_meteo.info()
<class 'pandas.core.frame.DataFrame'>
Index: 20494 entries, 0 to 20493
Data columns (total 31 columns):
 #   Column                   Non-Null Count  Dtype         
---  ------                   --------------  -----         
 0   ivykio_rusis             20494 non-null  object        
 1   ivykio_schema            20494 non-null  object        
 2   zuvo                     20494 non-null  float64       
 3   suzeista                 20494 non-null  float64       
 4   paros_metas              20494 non-null  object        
 5   meteo_salygos            20494 non-null  object        
 6   kelio_dangos_bukle       20494 non-null  object        
 7   autoivykio_laikas        20494 non-null  datetime64[ns]
 8   plat_wgs                 20494 non-null  float64       
 9   ilg_wgs                  20494 non-null  float64       
 10  art_stotis               20494 non-null  object        
 11  autoivykio_laikas_00min  20494 non-null  datetime64[ns]
 12  t                        20351 non-null  float64       
 13  vis_aws                  20344 non-null  float64       
 14  snow_aws                 20174 non-null  float64       
 15  t_0                      20384 non-null  float64       
 16  t_min_hw                 20410 non-null  float64       
 17  t_max_hw                 20410 non-null  float64       
 18  ws_max_hw                20379 non-null  float64       
 19  rr_per                   20337 non-null  float64       
 20  rr_per_3val              20239 non-null  float64       
 21  rr_per_6val              20137 non-null  float64       
 22  rr_per_12val             19921 non-null  float64       
 23  snow_aws_per_3val        20100 non-null  float64       
 24  snow_aws_per_6val        19999 non-null  float64       
 25  snow_aws_per_12val       19835 non-null  float64       
 26  ws_max_hw_3val           20342 non-null  float64       
 27  t_0_3val                 20369 non-null  float64       
 28  t_min_hw_3val            20377 non-null  float64       
 29  vis_aws_3val             20234 non-null  float64       
 30  dangos_bukle_konv        20494 non-null  object        
dtypes: datetime64[ns](2), float64(22), object(7)
memory usage: 5.0+ MB

1.2 Autoįvykių pasikartojimas¶

Čia vertinamas autoįvykių pasikartojimas atsiromis dienomis, savaitės dienomis ir mėnesiais.

Daugiausiai įskaitinių autoįvykių analizuojamu laikotarpiu įvyko 2021-05-12 ir 2020-09-25 d. (po 24 avarijas per dieną).

In [10]:
# Autoįvykių per dieną
autoivykiai_meteo.groupby("ivykio_data")["ivykio_data"].count().sort_values(ascending=False).head(10)
Out[10]:
ivykio_data
2021-05-12    24
2020-09-25    24
2017-08-14    23
2020-09-11    22
2017-11-16    21
2021-10-29    21
2017-09-27    20
2022-05-13    20
2020-07-24    20
2023-09-29    20
Name: ivykio_data, dtype: int64

Per 2017-2023 m. laikotarpį daugiausiai avarijų vyko penktadieniais.

In [11]:
#Autoįvykiai savaitės dienomis
autoivykiai_meteo.groupby("sav_diena")["ivykio_data"].count().sort_values(ascending=False)
Out[11]:
sav_diena
5    3423
3    3063
4    3013
1    3001
2    2973
6    2792
7    2229
Name: ivykio_data, dtype: int64

Daugiausiai autoįvykių įvykio šiltaisiais metų mėnesiais (rugpjūtis, birželis, rugsėjis, liepa).

In [12]:
# Autoįvykių per mėnesį
autoivykiai_meteo.groupby("menuo")["ivykio_data"].count().sort_values(ascending=False).head(10)
Out[12]:
menuo
8     2236
6     2151
9     2064
7     2062
5     1936
10    1885
12    1601
11    1571
4     1390
1     1297
Name: ivykio_data, dtype: int64

Daugiausiai autoįvykių įvyko giedromis sąlygomis esant sausai kelio dangos būklei (11058 atv.). Antroje vietoje yra apsiniaukusios sąlygos su šlapia kelio danga (2608 atv.) (aktualu PIRMAI HIPOTEZEI).

In [13]:
#Autoįvykių skaičius pagal meteo sąlygas ir kelio dangos būklė
autoivykiai_meteo.groupby(["meteo_salygos", "dangos_bukle_konv"])["kelio_dangos_bukle"].count().head(60).sort_values(ascending = False) #head(60)
Out[13]:
meteo_salygos   dangos_bukle_konv
Giedra          Sausa                11058
Apsiniaukę      Šlapia                2608
                Sausa                 2474
Lietus          Šlapia                1827
Giedra          Šlapia                 715
Sniegas, kruša  Apsnigta               346
Apsiniaukę      Apsnigta               220
Giedra          Apledėjusi             207
Apsiniaukę      Apledėjusi             205
Lijundra        Šlapia                 169
Sniegas, kruša  Šlapia                 129
Giedra          Apsnigta               129
Rūkas           Šlapia                  99
Sniegas, kruša  Apledėjusi              51
Rūkas           Sausa                   43
Pūga            Apsnigta                31
Lijundra        Apledėjusi              28
Stiprus vėjas   Sausa                   23
Rūkas           Apledėjusi              16
Stiprus vėjas   Šlapia                  14
                Apledėjusi              13
Lijundra        Apsnigta                12
Lietus          Apledėjusi              12
                Apsnigta                11
Pūga            Apledėjusi              10
Lietus          Sausa                   10
Giedra          Užteršta                 9
Rūkas           Apsnigta                 8
Stiprus vėjas   Apsnigta                 6
Apsiniaukę      Užteršta                 6
Sniegas, kruša  Sausa                    3
Pūga            Šlapia                   1
Lijundra        Sausa                    1
Name: kelio_dangos_bukle, dtype: int64

Daugiausu žuvusių ir sužeistų asmenų buvo giedromis ir sauso kelio dangos sąlygomis (žuvo 529, sužeista 12736). Antroje vietoje yra apsiniaukusios, šlapios kelios dangos sąlygos (163 žuvo, 2978 sužeisti) (aktualu PIRMAI HIPOTEZEI).

In [14]:
#Autoįvykių skaičius pagal meteo sąlygas ir kelio dangos būklė
autoivykiai_meteo.groupby(["meteo_salygos", "dangos_bukle_konv"]).agg({"zuvo": "sum",                                                                                                                                           
                                                                       "suzeista": "sum"}).head(10).sort_values(by="suzeista", ascending = False)
Out[14]:
zuvo suzeista
meteo_salygos dangos_bukle_konv
Giedra Sausa 529.0 12736.0
Apsiniaukę Šlapia 163.0 2978.0
Sausa 155.0 2773.0
Giedra Šlapia 47.0 812.0
Apledėjusi 12.0 279.0
Apsiniaukę Apledėjusi 15.0 275.0
Apsnigta 15.0 269.0
Giedra Apsnigta 8.0 155.0
Užteršta 0.0 11.0
Apsiniaukę Užteršta 0.0 8.0

Vertinant autoįvykių skaičių, sužeistų ir žuvusių skaičių nustatyta, kad vyravo giedros ir sausos kelio dangos sąlygos. Tokie rezultatai kelia abejonių, nes skirtumai nuo kitų sąlygų siekia kartais. Atrodo, kad kad neproporcingai daug autoįvykių patenka į giedras ir sausos kelio dangos būklės kategorijas, nors Lietuvoje tokios sąlygos nėra dažnos. Sunku pasakyti kodėl tiek atvejų patenka į šitas dvi kategorijas. Nustatyta, kad daugiausiai autoįvykių įvyksta šiltaisiais metų mėnesiais, kuriais, galime daryti prielaidą, šiltos (~ giedros) ir sausos sąlygos gali pasitaikyti dažniau. Taip pat ateityje reiktų pasiaiškinti ar pildant autoįvykių duomenis ir tiksliai nežinant kokios iš tiesų sąlygos buvo, nėra kaip numatytosios reikšmės įvedamos "giedra ir sausa kelio danga", nes šiame tyrimo etape to įrodyti negalima. Dėl šių argumentų PIRMA HIPOTEZĖ atmetama kaip neteisinga.

2. Meteorologinės sąlygos autoįvykių metu¶

2.1 Pagal autoįvykių rūšį¶

Didesnė autoįvykių dalis, kuomet įvyko susidūrimas, kiti eismo įvykiai, užvažiavimas ant pesčiojo, kliūties, apvirtimas ir susidūrimas su stovinčia transporto priemone įvyko temperatūrai esant apie 0-5 C ir apie 15-18 C. Susidūrimas su dviračiu, mopedu ir tarp dviračių dažniau pasitaiko esant aukštensnei oro temperatūrai - 10-22 C, kas susiję su šių transporto priemonių naudojimo sezoniškumu.

In [15]:
sns.violinplot(x='t', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()

Vienos valandos kritulių kiekis (rr_per) neturi tokio išraiškingo dėsningumo kaip oro temperatūros atveju. Tai, tikėtina, susiję su dažnu kritulių apatinės ribos artimos 0 mm reikšmių pasikartojimu. Panaši situacija ir sniego dangos storiu (nepavaizduota).

In [16]:
sns.violinplot(x='rr_per', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()

Maksimalus vėjo greitis įvairių autoįvykių rūšių metu yra panašus. Dažnesnės mažesnio vėjo greičio reikšmės (apie 3-5 m/s) buvo susidūrimų tarp dviračių įvykių metu.

In [17]:
sns.violinplot(x='ws_max_hw', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()

Matomumas (galimas matyti atstumas) dažniausiai siekia apie 20000 m (arba 20 km = puikus matomumas), tačiau tai yra dėl to, kad ši riba yra dažniausiai pasikartojanti (viršutinė). Iš visų autoįvykių rūšių dažniau mažesnis matomumas fiksuotas užvažiavimo ant pesčiojo atvejais.

In [18]:
sns.violinplot(x='vis_aws', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()

IŠVADA: meteorologinės sąlygos pasižymi menkais dėsningumais vertinant kokios sąlygos vyravo tam tikrų autoįvykių rūšių atvejais.

2.2 Pagal nustatytas meteo. sąlygas¶

Šiame poskyryje vertinama, kaip autoįvykių metu išskirtos ir statistikoje pateiktos meteorologinės sąlygos (y ašis) susijusios su artimiausioje meteorologijos stotyje išmatuotomis rodikių reikšmėmis (x ašis). Giedros sąlygos dažniau pasitaikė, kai buvo aukštesnė oro temperatūra (apie 15-25 C). Logiška, nes aukštesnio atmosferos slėgio dariniai (anticiklonai) atneša šiltas ir giedras sąlygas. Cikloninė cirkuriacija siejama su šaltesnėmis, apsiniaukusiomis ir neretai su krituliais oro sąlygosmis (grafike atsiniaukusios oro sąlygos dažnesnės esant temperatūros reikšmėms apie 0, bet pasitaiko ir 10-20 C intervale). Žiemos reiškiniai, kaip sniegas/kruša ir pūga - esant temperatūrai žemiau nulio. Iš dalies su tuo susijusi ir lijundra, tačia dažniausias jos temperatūros reikšmių intervalas yra kiek virš 0 C.

In [19]:
sns.violinplot(x='t', y='meteo_salygos', data=autoivykiai_meteo)
plt.show()

Autoįvykių statistikoke išskirti lijundros atvejai turi reikšmių ir >10 C, kas yra abejotina, nes lijundrai formuotis reikalinga temperatūra apie nulį šiek tiek teigiama. Be to, lijundai būdintas šaltasis metų laikas, o aukštesniame oro temperatūros ruože pasitaikę su lijundra sieti autoįvykiai vyko liepos-rugpjūčio mėn. Taip pat lijundrai yra būtina neigiama paviršiaus oro temperatūros (t_0) sąlyga. Tokie atvejai kelia įtarimų gali būti neteisingai identifikuotos meteorologinės sąlygos autoįvykių metu (bent jau pavieniais atvejais) (aktualu ANTRAI HIPOTEZEI).

In [20]:
autoivykiai_meteo[autoivykiai_meteo["meteo_salygos"] == "Lijundra"][["t", "t_0", "autoivykio_laikas"]].sort_values(by="t",ascending=False).head(10)
Out[20]:
t t_0 autoivykio_laikas
11053 25.7 26.0 2020-08-22 17:16:00
13477 21.3 20.9 2021-07-31 21:00:00
13585 21.3 23.3 2021-08-10 19:50:00
13568 18.7 18.3 2021-08-08 16:57:00
13556 18.6 19.4 2021-08-07 12:45:00
20347 17.9 18.1 2023-08-26 10:10:00
5167 17.3 18.4 2018-08-14 15:24:00
18632 17.0 18.9 2023-07-22 13:30:00
628 16.5 16.4 2017-07-27 05:39:00
13553 15.9 15.8 2021-08-07 00:40:00

Pagal aukštesnį grafiką taip pat abejotinos rūko reikšmės esant temperatūrai >10 ar 15 C.

In [21]:
autoivykiai_meteo[autoivykiai_meteo["meteo_salygos"] == "Rūkas"][["t", "t_0", "autoivykio_laikas"]].sort_values(by="t",ascending=False).head(10)
Out[21]:
t t_0 autoivykio_laikas
10136 21.0 19.6 2020-07-19 01:53:00
10629 17.1 15.5 2020-08-21 07:45:00
4638 15.6 14.8 2018-09-19 22:08:00
16717 15.4 15.4 2022-08-06 21:06:00
5596 15.3 16.3 2018-08-17 03:50:00
18490 14.4 13.8 2023-06-16 01:00:00
11861 14.3 12.7 2020-08-02 01:45:00
11854 14.2 14.4 2020-09-15 08:33:00
8598 13.5 12.0 2019-08-27 04:40:00
6778 12.8 11.3 2019-07-18 04:24:00

Giedra dažniau buvo tuomet, kai kritulių kiekis artimas nuliui, tačiau pasitaiko atvejų, kad kritulių kiekis per valandą (rr_per) galėjo būti ir ženklus (>5 mm). Tai gali būti susiję ir su duomenų kokybe, tačiau nereikia atmesti didelio kritulių nehomogeniškumo laike ir erdvėje požymio. T.y., priskirtoje artimiausioje stotyje galėjo lyti, o autoįvykio vietoje - ne. Kitomis išskirtomis meteorologinėmis sąlygomis kritulių kiekis yra logiškas (sniegas, kruša, lietus, lijundra, pūga).

In [22]:
sns.violinplot(x='rr_per', y='meteo_salygos', data=autoivykiai_meteo) 
plt.show()

Atvejai, kai meteorologinės sąlygos nustatytos kaip giedros, o kritulių kiekis per valandą ar 6 val. buvo ženklus. Galima pastebėti, kad vienos valandos ir 6 val. kritulių kiekis atvejais, kai buvo giedros sąlygos, yra pakankamai artimas. Tai reiškia, kad 6 val. kritulių kiekis iškrito per vieną val. (rodo sąlygų pokytį).

In [23]:
autoivykiai_meteo[autoivykiai_meteo["meteo_salygos"] == "Giedra"][["rr_per","rr_per_6val", "meteo_salygos", "autoivykio_laikas"]].sort_values(by="rr_per",ascending=False).head(10)
Out[23]:
rr_per rr_per_6val meteo_salygos autoivykio_laikas
13318 17.7 21.6 Giedra 2021-07-17 19:41:00
978 14.8 14.8 Giedra 2017-08-12 19:24:00
4000 10.7 10.7 Giedra 2018-06-11 17:07:00
13574 8.6 9.7 Giedra 2021-08-09 13:00:00
13575 8.6 9.7 Giedra 2021-08-09 13:10:00
4040 6.0 14.6 Giedra 2018-08-11 20:29:00
5613 5.3 5.3 Giedra 2018-08-05 14:20:00
10042 4.8 5.5 Giedra 2020-07-23 08:36:00
15838 4.2 8.7 Giedra 2022-07-28 13:30:00
13505 4.0 4.0 Giedra 2021-08-03 11:59:00

Sniego storis (snow_aws) buvo didesnis tais autoįvykių atvejais, kurie priskirtos sniego/krušos, pūgos, stipraus vėjo (galima sąsaja su pūga, nes pūga yra sniegas + vėjas) meteorologinės sąlygos.

In [24]:
sns.violinplot(x='snow_aws', y='meteo_salygos', data=autoivykiai_meteo)
plt.show()

Autoįvykių metu artimiausiose meteorologijos stotyje nustatytas maksimalus valandos vėjo greitis (ws_max_hw) buvo mažesnis autoįvykių statistikoje priskirtais rūko atvejais. Tai iš dalies atitinka meteorologijos teoriją, kurioje nurodoma, kad rūkui formuotis palankus nestiprus vėjos (2-4 m/s). Pūgos ir stipriaus vėjo atvejais maksimalaus vėjo reikšmių intervalas vyrauja didesnio vėjo greičio skalės dalyje nei kitais atvejais. Likusių išskirtų meteorologinių sąlygų metu buvusių maksimalių vėjo reikšmių pasiskirstymas panašus.

In [25]:
sns.violinplot(x='ws_max_hw', y='meteo_salygos', data=autoivykiai_meteo)
plt.show()

IŠVADA: išskirtos meteorologinės sąlygos autoįvykių statistikoje neblogai atitinka reiškinių apibūdinimą ir jų pasikartojimą tam tikros oro temperatūros, vėjo ar kt. atvejais. Tačiau statistikoje pateikta klasifikacija kai kuriais atvejais prasilenkia su meteorologijos teorija ir turi būti atskirai analizuojami ir, esant reikalui, atmetami. Netikslumai galėjo atsirasti suvedant autoįvykių statistinius duomenis, o gal net ir jas įvertinant ir priskiriant autoįvykiui. Šiame tyrime meteorologinių grupių klasifikacijos tikslumo vertinimas ir duomenų tikslinimas nenumatytas, bet tai gali būti atliekama ateityje (aktualu ANTRAI HIPOTEZEI).

2.3 Pagal kelio dangos būklę¶

Arti nulio esanti ir neigiama temperatūra daugiausiai susijusi su apledėjusia, apsnigta kelio danga. Šlapia kelios dangos būklė daugiausiai buvo kai temperatūra viršijo 0 C, bet nesiekė 10 C (atitinka sniego, ledo tirpsmo ir mažo garavimo sąlygas). Sausa kelio dangos būklė daugiausiai fiksuota tuomet, kai vyravo šiltos orų sąlygos (apie 15-25 C), kas susiję su geresniu garavimu ir šiltesniais orais. (Kelio dangos būklė "užteršta" šiame tyrime nėra aktuali).

In [26]:
sns.violinplot(x='t', y='dangos_bukle_konv', data=autoivykiai_meteo) 
plt.show()

Kritulių kiekis apledėjusios ir apsnigtos kelio dangos atvejais dažniau pasitaikė artimas 0. Šlapios dangos atveju kritulių kiekis per valandą buvo ir didesnis, tačiau keista, kad panaši situacija fiksuojama ir sausos kelio dangos metu. Verta prisiminti tyrimo pradžioje keltą problematiką ar giedros ir sausos kelio dangos sąlygos yra gerai identifikuojamos (aktualu ANTRAI HIPOTEZEI).

In [27]:
sns.violinplot(x='rr_per', y='dangos_bukle_konv', data=autoivykiai_meteo)
plt.show()

Kelio dangos būklė esant išmatuotai sniego dangai (snow_aws) buvo apledėjusi, apsnigta, šlapia ir, nors mažiau atvejų, tačiau ir sausos kelio būklės metu. Teoriškai tokia situacija įmanoma, tačiau esant sniego dangai ant kelio būklė turėtų būti priskiriama "apsnigta" kategorijai. Todėl atkreipiamas dėmesys į sausą kelio būklę (aktualu ANTRAI HIPOTEZEI).

In [28]:
sns.violinplot(x='snow_aws', y='dangos_bukle_konv', data=autoivykiai_meteo)
plt.show()
In [29]:
# paruošiama agreguota lentelė
auto_merged = autoivykiai_meteo.groupby(["meteo_salygos", "dangos_bukle_konv"]).agg({"t": "mean",
                                                                 "t_0": "mean",
                                                                 "rr_per": "mean",
                                                                 "snow_aws": "mean",
                                                                 "vis_aws": "mean",
                                                                 "ws_max_hw": "mean"
                                                                       }).round(1) 

Toliau bus vertinamos vidutinės išmatuotos meteorologinės sąlygos autoįvykių metu nustatytoms sąlygos ir kelio dangos būklei. Grupuotoje lentelėje pateiktas oro ir dirvožemio paviršiaus temperatūros, kritulių kiekio, sniego dangos storio, matomumo ir maksimalaus vėjo greičio vidurkiai pagal autoįvykių metu išskirtas meteorologines sąlygas ir kelio dangos būklę (kategorijomis). Galima pastebėti, kad iš esmės gautos reikšmės didesne dalimi atitinka meteorologinę logiką. Pavyzdžiai.

  • Apsiniaukusiomis ir giedromis sąlygomis (nepriklausomai nuo kelio dangos būklės) kritulių kiekis artimas 0 mm.
  • Lietaus, lijundros, pūgos atvejais kritulių kiekis vidutiniškai gali siekti ir iki 0,7 mm/val.
  • Rūko atveju kritulių beveik nebūna.
  • Mažiausias matomumas yra lijundros, rūko ir pūgos atvejais.
  • Didžiausias vidutinis vėjo greitis - pūgos, stipraus vėjo atvejais.
  • Neigiama oro ar dirvožemio paviršiaus temperatūra vyrauja tada, kai kelio dangos būklė yra apledėjusi, apsnigta arba krenta sniegas/kruša.
In [30]:
cm = sns.light_palette("green",  as_cmap=True)
auto_merged.style.format(precision=1).background_gradient(cmap=cm)
Out[30]:
    t t_0 rr_per snow_aws vis_aws ws_max_hw
meteo_salygos dangos_bukle_konv            
Apsiniaukę Apledėjusi -1.3 -1.2 0.0 2.6 12744.8 6.9
Apsnigta -3.0 -1.9 0.1 7.4 9471.7 6.7
Sausa 10.3 11.4 0.0 0.2 17743.6 6.8
Užteršta 6.9 6.5 0.0 2.7 16320.7 4.9
Šlapia 5.6 5.8 0.1 1.3 13757.7 7.2
Giedra Apledėjusi -1.7 -1.2 0.0 2.9 15003.6 6.7
Apsnigta -5.5 -2.4 0.1 10.5 13504.6 6.4
Sausa 15.9 19.8 0.0 0.1 19115.9 6.5
Užteršta 13.0 16.9 0.0 2.1 16941.4 6.5
Šlapia 5.2 6.0 0.1 1.5 15713.9 6.9
Lietus Apledėjusi 1.1 0.7 0.6 1.1 10003.6 9.4
Apsnigta 0.9 0.2 0.7 6.0 5806.1 8.3
Sausa 7.0 6.9 0.4 0.0 13836.5 7.6
Šlapia 8.6 8.6 0.5 0.3 12555.6 8.1
Lijundra Apledėjusi -0.1 -0.5 0.2 3.1 8496.2 8.5
Apsnigta -0.1 -0.4 0.6 3.6 4963.0 6.9
Sausa 7.5 7.9 0.0 0.0 2352.0 3.3
Šlapia 5.2 5.0 0.2 1.1 11354.2 7.9
Pūga Apledėjusi -1.8 -0.4 0.2 2.4 11373.1 13.0
Apsnigta -2.7 -1.8 0.6 5.9 4026.1 10.1
Šlapia -0.1 3.8 0.0 0.0 20000.0 10.3
Rūkas Apledėjusi -1.0 -1.4 0.1 4.4 5072.4 5.4
Apsnigta -3.9 -1.7 0.0 7.6 7438.9 5.4
Sausa 7.5 6.6 0.0 0.1 7422.7 3.1
Šlapia 3.4 3.3 0.0 1.4 3755.4 4.3
Sniegas, kruša Apledėjusi -2.3 -1.2 0.2 5.0 8081.6 8.2
Apsnigta -2.2 -1.4 0.4 6.0 5676.5 7.2
Sausa -2.5 -1.5 0.0 0.0 11055.3 7.9
Šlapia -0.4 -0.3 0.3 3.4 7823.0 7.9
Stiprus vėjas Apledėjusi -2.4 -1.5 0.0 4.6 14727.5 11.2
Apsnigta -1.8 -1.5 0.3 3.2 7848.5 10.4
Sausa 4.4 4.1 0.0 0.1 19413.3 11.7
Šlapia 3.3 3.5 0.2 0.8 14287.5 11.7

Pagal šias vidutines sąlygas duomenų prieštaravimo giedros metu buvusioms sausoms sąlygos nepastebima, nors prieš tai analizėje atskiri atvejai yra kvestionuotini. Bendrai, visos išmatuotos meteorologinės sąlygos siejasi su autoįvykiu metu nustatytomis meteorologinių sąlygų kategorijomis ir kelio dangos būkle, nors atskiri pavieniai atvejai ir nėra tinkami. Suprantant tyrimo metu apjungtų duomenų šaltinių neapibrėžtumus (pvz., artimiausios meteorologijos stoties duomuo nebūtinai atitinka autoįvykio metu buvusias sąlygas arba autoįvykio metu nustatytos meteorologinių sąlygų ar kelios dangos būklės kategorijos gali būti vizualiai netinkamai įvertintos) ir remiantis gautais rezultatais, ANTRA HIPOTEZĖ priimama kaip teisinga.

3. Kelio dangos būklės prognozavimas atliekant mašininį mokymąsi¶

In [31]:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.metrics import classification_report
from sklearn.linear_model import LinearRegression 
from sklearn.metrics import mean_squared_error, mean_absolute_error 
from sklearn import preprocessing

Šioje dalyje sudaromi keli modeliai, kuriais prognozuojama kelio dangos būklės kategorija (sausa, šlapia, apledėjusi, apsnigta [užteršta nenaudojama]) pagal išmatuotas meteorologinių rodiklių reikšmes.

In [32]:
# Atrenkami ir sutvarkomi pradiniai duomenys apmokymui ir parengiama duomenų imtis:
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Sausa", "dangos_bukle_konv1"] = 0
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Šlapia", "dangos_bukle_konv1"] = 1
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Apledėjusi", "dangos_bukle_konv1"] = 2
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Apsnigta", "dangos_bukle_konv1"] = 3
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Užteršta", "dangos_bukle_konv1"] = 4
autoivykiai_meteo["dangos_bukle_konv1"] = autoivykiai_meteo["dangos_bukle_konv1"].astype(int) 
autoivykiai_meteo = autoivykiai_meteo.drop(autoivykiai_meteo[autoivykiai_meteo['dangos_bukle_konv'] == 'Užteršta'].index)

# prognozuojamas/priklausomas kintamasis
y1 = "dangos_bukle_konv1"

autoivykiai_meteo["dangos_bukle_konv"].unique()
Out[32]:
array(['Apledėjusi', 'Apsnigta', 'Šlapia', 'Sausa'], dtype=object)
In [33]:
autoivykiai_meteo.head(3)
Out[33]:
ivykio_rusis ivykio_schema zuvo suzeista paros_metas meteo_salygos kelio_dangos_bukle autoivykio_laikas plat_wgs ilg_wgs art_stotis autoivykio_laikas_00min t vis_aws snow_aws t_0 t_min_hw t_max_hw ws_max_hw rr_per rr_per_3val rr_per_6val rr_per_12val snow_aws_per_3val snow_aws_per_6val snow_aws_per_12val ws_max_hw_3val t_0_3val t_min_hw_3val vis_aws_3val dangos_bukle_konv sav_diena ivykio_data menuo dangos_bukle_konv1
0 Susidūrimas Susidūrimai judant ta pačia kryptimi 0.0 1.0 Tamsus paros metas Giedra Apledėjęs asfaltas 2017-01-02 17:59:00 55.542831 22.284767 Laukuvos AMS 2017-01-02 17:00:00 -0.6 20000.0 0.0 -1.1 -0.8 0.0 9.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.4 -1.1 -0.8 20000.0 Apledėjusi 1 2017-01-02 1 2
1 Kiti eismo įvykiai Nuvažiavimai nuo kelio 0.0 1.0 Tamsus paros metas Giedra Apsnigtas asfaltas 2017-01-06 05:24:00 54.210509 24.563795 Varėnos AMS 2017-01-06 05:00:00 -19.1 20000.0 14.0 -0.6 -19.5 -18.9 NaN 0.0 0.0 0.0 0.0 14.0 15.0 15.0 NaN -0.6 -19.5 19959.0 Apsnigta 5 2017-01-06 1 3
2 Kiti eismo įvykiai Kiti eismo įvykiai 1.0 1.0 Tamsus paros metas Apsiniaukę Apledėjęs asfaltas 2017-01-08 04:33:00 55.113323 22.258615 Laukuvos AMS 2017-01-08 04:00:00 -11.2 6251.0 0.0 -1.8 -12.2 -10.1 2.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.2 -1.8 -12.2 6251.0 Apledėjusi 7 2017-01-08 1 2

3.1 Tiesinė regresija¶

Tiesinė regresija su vienu iš kintamųjų (oro temperatūra, dirvožemio paviršiaus temperatūra, kritulių kiekiu, sniego dangos storiu ar matomumu) demontruoja mažą modelio patikimumą (iki ~0.3).

In [34]:
x1 = "t_0"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]

X = a1[[x1]] 
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.2940678032107227
In [35]:
x1 = "t"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]

X = a1[[x1]] 
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.3158270129030327
In [36]:
x1 = "rr_per"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]

X = a1[[x1]] 
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.021874891235001637
In [37]:
x1 = "vis_aws"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]

X = a1[[x1]] 
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.27525709402672327
In [38]:
x1 = "snow_aws"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]

X = a1[[x1]] 
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.21575918598654087

Tiesinė regresija su keliais kintamaisiais (oro temperatūra, dirvožemio paviršiaus temperatūra, kritulių kiekiu, sniego dangos storiu ar matomumu) demontruoja mažą modelio patikimumą (iki ~0.45).

In [39]:
#### VISI RODIKLIAI
rod = ["t","vis_aws", "snow_aws", "t_0", "ws_max_hw", "rr_per"]
a1 = autoivykiai_meteo.dropna(subset= rod)

X = a1[rod] 
y = a1[[y1]] 

### https://www.geeksforgeeks.org/multiple-linear-regression-with-scikit-learn/
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train,y_train)
predictions = model.predict(X_test) 

# model evaluation 
print('mean_squared_error : ', mean_squared_error(y_test, predictions)) 
print('mean_absolute_error : ', mean_absolute_error(y_test, predictions)) 
print("Model score test:", model.score(X_test, y_test))
mean_squared_error :  0.2799807269057089
mean_absolute_error :  0.36974050098822275
Model score test: 0.46412929886924803

3.2 Logistinė regresija¶

Logistinės regresijos patikimumas, naudojant dirvožemio paviršiaus temperatūros ir 3 val. kritulių kiekio nepriklausomus kintamuosius, siekia ~0.76. Sausos sąlygos (0) prognozuojamos gerai (precision ~0.83), o aplėdėjusios ir apsnigtos - beveik nenumatomos (<0.26)

In [40]:
x1 = "t_0"
x2 = "rr_per_3val"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
a1 = a1[a1[x2].notna()] 

X = a1[[x1, x2]] 
y = a1[[y1]] 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

model = LogisticRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
print("Model metrics test:", metrics.confusion_matrix(y_test, y_predicted))
print(classification_report(y_test, y_predicted))
Model score test: 0.7419728566699768
Model metrics test: [[3566  392    0   49]
 [ 746  903    0   13]
 [   7  153    0    7]
 [   2  190    0   14]]
              precision    recall  f1-score   support

           0       0.83      0.89      0.86      4007
           1       0.55      0.54      0.55      1662
           2       0.00      0.00      0.00       167
           3       0.17      0.07      0.10       206

    accuracy                           0.74      6042
   macro avg       0.39      0.38      0.38      6042
weighted avg       0.70      0.74      0.72      6042

C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\utils\validation.py:1143: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))

Logistinės regresijos patikimumas, naudojant dirvožemio paviršiaus temperatūros, 3 val. kritulių kiekio ir matomumo nepriklausomus kintamuosius, siekia ~0.70. Geriausiai prognozuojamos sausos (0) ir iš dalies šlapios (1) sąlygos.

In [41]:
x1 = "t_0"
x2 = "rr_per_3val"
x3 = "vis_aws"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
a1 = a1[a1[x2].notna()] 
a1 = a1[a1[x3].notna()] 

X = a1[[x1, x2, x3]] 
y = a1[[y1]] 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

model = LogisticRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
print("Model metrics test:", metrics.confusion_matrix(y_test, y_predicted))
print(classification_report(y_test, y_predicted))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\utils\validation.py:1143: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
Model score test: 0.7543597409068261
Model metrics test: [[3738  217    0   41]
 [ 826  770    0   34]
 [  65   92    0   15]
 [  18  171    0   34]]
              precision    recall  f1-score   support

           0       0.80      0.94      0.86      3996
           1       0.62      0.47      0.53      1630
           2       0.00      0.00      0.00       172
           3       0.27      0.15      0.20       223

    accuracy                           0.75      6021
   macro avg       0.42      0.39      0.40      6021
weighted avg       0.71      0.75      0.73      6021

C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))

Logistinės regresijos patikimumas, naudojant visus penkis kintamuosiu, siekia ~0.76. Visi penki kintamieji nepagerina prognozavimo.

In [42]:
rod = ["vis_aws", "snow_aws", "t_0", "ws_max_hw", "rr_per"]
a1 = autoivykiai_meteo.dropna(subset=rod)

X = a1[rod] 
y = a1[[y1]] 

### https://www.geeksforgeeks.org/multiple-linear-regression-with-scikit-learn/
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LogisticRegression()
model.fit(X_train,y_train)
predictions = model.predict(X_test) 

# model evaluation 
print('mean_squared_error : ', mean_squared_error(y_test, predictions)) 
print('mean_absolute_error : ', mean_absolute_error(y_test, predictions)) 
print("Model score test:", model.score(X_test, y_test))
print(classification_report(y_test, predictions))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\utils\validation.py:1143: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
mean_squared_error :  0.42701525054466233
mean_absolute_error :  0.3070219540807776
Model score test: 0.7479470420646891
              precision    recall  f1-score   support

           0       0.82      0.91      0.86      4006
           1       0.58      0.47      0.52      1592
           2       0.04      0.01      0.02       158
           3       0.37      0.27      0.32       211

    accuracy                           0.75      5967
   macro avg       0.45      0.42      0.43      5967
weighted avg       0.72      0.75      0.73      5967

C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
In [43]:
# cf_matrix = metrics.confusion_matrix(y_test, predictions)
# sns.heatmap(cf_matrix/np.sum(cf_matrix), annot=True, 
# fmt='.2%', cmap='Blues')
# plt.show()

Išvada: logistinė regresija yra tinkamesnė nei tiesinė. Tačiau bendras modelio patikimumas gali tesiekti ~0.75 ir nelabai priklauso nuo naudojamų meteorologinių kintamųjų įvesties. Bet kokiu atveju, sausa kelio danga prognozuojama neblogai, šlapia - pusėtinai, tačiau panaudotas mašininis mokymasis nėra tinkamas žiemos meto kelio dangos prognozavimui (aplėdėjusi, apsnigta kelio danga).

IŠVADOS IR APIBENDRINIMAS¶

PIRMA HIPOTEZĖ. Daugiausiai autoįvykių įvyko vykstant pavojingoms meteorologinėms sąlygoms - ATMESTA.
ANTRA HIPOTEZĖ. Autoįvykių statistikoje nurodomos meteorologinės sąlygos dažniausiai nurodytos tinkamai - PRIIMTA.

Apibendrinimas

Analizuojant įskaitinių autoįvykių Lietuvoje duomenis 2017-2023 m. nustatyta, kad daugiau autoįvykių įvyksta šiltojo sezono mėnesiais (birželis- rugsėjis). Daugiausiai autoįvykių įvyksta penktadieniais, mažiausiai pirmadieniais. Vidutiniškai autoįvykiai įvyksta 14:31:58 laiku. Daugiausiai autoįvykių įvyko giedromis sąlygomis esant sausai kelio dangos būklei (11058 atv.). Antroje vietoje yra apsiniaukusios sąlygos su šlapia kelio danga (2608 atv.). Daugiausiai žuvusių ir sužeistų asmenų buvo giedromis ir sauso kelio dangos sąlygomis (žuvo 529, sužeista 12736). Antroje vietoje yra apsiniaukusios, šlapios kelios dangos sąlygos (163 žuvo, 2978 sužeisti). Vidutiniškai išmatuotos meteorologinės sąlygos atititinka nustatytų sąlygų autoįvykių metu meteorologinę klasifikacija, tačiau yra atskiri atvejai, kurios reikėtų peržiūrėti ir įvertinti jų klasifikavimo tinkamumą. Tai atlikus gali pagerėti mašininio mokymo algoritmų gebėjimas suprognozuoti kelio dangos būklės sąlygas, nes kol kas prognozavimas yra ribotas. Taip pat ateityje galima naudoti daugiau nei 18 meteorologijos stočių duomenis.